home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / rhinosrc.lha / sockuser.c < prev    next >
C/C++ Source or Header  |  1993-06-23  |  3KB  |  108 lines

  1. /* Higher level user subroutines built on top of the socket primitives
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #ifdef    ANSIPROTO
  6. #include <stdarg.h>
  7. #endif
  8. #include <errno.h>
  9. #include "mbuf.h"
  10. #include "proc.h"
  11. #include "socket.h"
  12. #include "usock.h"
  13. #include "session.h"
  14. #include "nr4.h"
  15.  
  16.  
  17. /* Higher-level receive routine, intended for connection-oriented sockets.
  18.  * Can be used with datagram sockets, although the sender id is lost.
  19.  */
  20. int
  21. recv(s,buf,len,flags)
  22. int s;        /* Socket index */
  23. char *buf;    /* User buffer */
  24. int len;    /* Max length to receive */
  25. int flags;    /* Unused; will eventually select oob data, etc */
  26. {
  27.     struct mbuf *bp;
  28.     int cnt;
  29.  
  30.     if(len == 0)
  31.         return 0;    /* Otherwise would be interp as "all" */
  32.  
  33.     cnt = recv_mbuf(s,&bp,flags,NULLCHAR,(int *)NULL);
  34.     if(cnt > 0){
  35.         cnt = min(cnt,len);
  36.         pullup(&bp,buf,(int16)cnt);
  37.         /*if (datagram) free_p(bp); else */
  38.         {
  39.             struct usock *up = itop(s);
  40.             up->ibuf = bp;
  41.         }
  42.     }
  43.     return cnt;
  44. }
  45. /* Higher level receive routine, intended for datagram sockets. Can also
  46.  * be used for connection-oriented sockets, although from and fromlen are
  47.  * ignored.
  48.  */
  49. int
  50. recvfrom(s,buf,len,flags,from,fromlen)
  51. int s;        /* Socket index */
  52. char *buf;    /* User buffer */
  53. int len;    /* Maximum length */
  54. int flags;    /* Unused; will eventually select oob data, etc */
  55. char *from;    /* Source address, only for datagrams */
  56. int *fromlen;    /* Length of source address */
  57. {
  58.     struct mbuf *bp;
  59.     register int cnt;
  60.  
  61.     cnt = recv_mbuf(s,&bp,flags,from,fromlen);
  62.     if(cnt > 0){
  63.         cnt = min(cnt,len);
  64.         pullup(&bp,buf,(int16)cnt);
  65.         /*if (datagram)*/
  66.         free_p(bp);
  67.         /*else {
  68.             struct usock *up = itop(s);
  69.             up->ibuf = bp;
  70.         }*/
  71.     }
  72.     return cnt;
  73. }
  74. /* High level send routine */
  75. int
  76. send(s,buf,len,flags)
  77. int s;        /* Socket index */
  78. char *buf;    /* User buffer */
  79. int len;    /* Length of buffer */
  80. int flags;    /* Unused; will eventually select oob data, etc */
  81. {
  82.     register struct mbuf *bp;
  83.     char sock[MAXSOCKSIZE];
  84.     int i = MAXSOCKSIZE;
  85.  
  86.     if(getpeername(s,sock,&i) == -1)
  87.         return -1;
  88.     bp = qdata(buf,(int16)len);
  89.     return send_mbuf(s,bp,flags,sock,i);
  90. }
  91. /* High level send routine, intended for datagram sockets. Can be used on
  92.  * connection-oriented sockets, but "to" and "tolen" are ignored.
  93.  */
  94. int
  95. sendto(s,buf,len,flags,to,tolen)
  96. int s;        /* Socket index */
  97. char *buf;    /* User buffer */
  98. int len;    /* Length of buffer */
  99. int flags;    /* Unused; will eventually select oob data, etc */
  100. char *to;    /* Destination, only for datagrams */
  101. int tolen;    /* Length of destination */
  102. {
  103.     register struct mbuf *bp;
  104.  
  105.     bp = qdata(buf,(int16)len);
  106.     return send_mbuf(s,bp,flags,to,tolen);
  107. }
  108.